﻿\section{Файл сохранения состояния в игре Millenium}
\label{Millenium_DOS_game}
\myindex{MS-DOS}

Игра \q{Millenium Return to Earth} под DOS довольно древняя (1991), позволяющая
добывать ресурсы, строить корабли, снаряжать их на другие планеты, итд.
\footnote{Её можно скачать бесплатно
\href{http://go.yurichev.com/17316}{здесь}}.

Как и многие другие игры, она позволяет сохранять состояние игры в файл.

Посмотрим, сможем ли мы найти что-нибудь в нем.

\clearpage
В игре есть шахта.
Шахты на некоторых планетах работают быстрее, на некоторых других --- медленнее. 
Набор ресурсов также разный.

Здесь видно, какие ресурсы добыты в этот момент: 

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/1.png}
\caption{Шахта: первое состояние}
\label{fig:mill_1}
\end{figure}

Сохраним состояние игры.
Это файл размером 9538 байт.

Подождем несколько \q{дней} здесь в игре и теперь в шахте добыто больше ресурсов:

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/2.png}
\caption{Шахта: второе состояние}
\label{fig:mill_2}
\end{figure}

Снова сохраним состояние игры.

Теперь просто попробуем сравнить оба файла побайтово используя простую утилиту FC под DOS/Windows:

\lstinputlisting{ff/millenium/fc_result.txt}

Вывод здесь неполный, там было больше отличий, но мы обрежем результат до самого интересного.

В первой версии у нас было 14 единиц водорода (hydrogen) и 102 --- кислорода (oxygen).

Во второй версии у нас 22 и 155 единиц соответственно.

Если эти значения сохраняются в файл, мы должны увидеть разницу.
И она действительно есть. 
Там 0x0E (14) на позиции 0xBDA и это значение 0x16 (22) в новой версии файла.
Это, наверное, водород.
Там также 0x66 (102) на позиции 0xBDC в старой версии и 0x9B (155) в новой версии файла. 
Это, наверное, кислород.

Обе версии файла доступны на сайте, для тех кто хочет их изучить (или поэкспериментировать): 
\href{http://go.yurichev.com/17212}{beginners.re}.

\clearpage
Новую версию файла откроем в Hiew и отметим значения, связанные с ресурсами, добытыми на шахте в игре: 

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/hiew3.png}
\caption{Hiew: первое состояние}
\label{fig:mill_hiew3}
\end{figure}

Проверим каждое, и это они.
Это явно 16-битные значения: не удивительно для 16-битной программы под DOS, где \Tint имел длину в 16 бит.

\clearpage
Проверим наши предположения.
Запишем 1234 (0x4D2) на первой позиции (это должен быть водород):

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/hiew4.png}
\caption{Hiew: запишем там (0x4D2)}
\label{fig:mill_hiew4}
\end{figure}

Затем загрузим измененный файл в игру и посмотрим на статистику в шахте:

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/5.png}
\caption{Проверим значение водорода}
\label{fig:mill_5}
\end{figure}

Так что да, это оно.

\clearpage
Попробуем пройти игру как можно быстрее, установим максимальные значения везде:

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/hiew7.png}
\caption{Hiew: установим максимальные значения}
\label{fig:mill_hiew7}
\end{figure}

0xFFFF это 65535, так что да, у нас много ресурсов теперь:

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/6.png}
\caption{Все ресурсы теперь действительно 65535 (0xFFFF)}
\label{fig:mill_6}
\end{figure}

\clearpage
Пропустим еще несколько \q{дней} в игре и видим что-то неладное! 
Некоторых ресурсов стало меньше:

\begin{figure}[H]
\centering
\myincludegraphics{ff/millenium/8.png}
\caption{Переполнение переменных ресурсов}
\label{fig:mill_8}
\end{figure}

Это просто переполнение. 
Разработчик игры, должно быть, никогда не думал, что значения ресурсов будут такими большими,
так что, здесь, наверное, нет проверок на переполнение, но шахта в игре \q{работает}, ресурсы добавляются,
отсюда и переполнение.

Вероятно, не нужно было жадничать.

Здесь наверняка еще какие-то значения в этом файле.

Так что это очень простой способ читинга в играх.
Файл с таблицей очков также можно легко модифицировать.

Еще насчет сравнения файлов и снимков памяти: \myref{snapshots_comparing}.
